// errchk $G -e $F.go

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

type I interface{}

const (
	// assume all types behave similarly to int8/uint8
	Int8   int8  = 101
	Minus1 int8  = -1
	Uint8  uint8 = 102
	Const  = 103

	Float32    float32 = 104.5
	Float64    float64 = 105.5
	ConstFloat = 106.5
	Big        float64 = 1e300

	String = "abc"
	Bool   = true
)

var (
	a1 = Int8 * 100              // ERROR "overflow"
	a2 = Int8 * -1               // OK
	a3 = Int8 * 1000             // ERROR "overflow"
	a4 = Int8 * int8(1000)       // ERROR "overflow"
	a5 = int8(Int8 * 1000)       // ERROR "overflow"
	a6 = int8(Int8 * int8(1000)) // ERROR "overflow"
	a7 = Int8 - 2*Int8 - 2*Int8  // ERROR "overflow"
	a8 = Int8 * Const / 100      // ERROR "overflow"
	a9 = Int8 * (Const / 100)    // OK

	b1   = Uint8 * Uint8                                 // ERROR "overflow"
	b2   = Uint8 * -1                                    // ERROR "overflow"
	b3   = Uint8 - Uint8                                 // OK
	b4   = Uint8 - Uint8 - Uint8                         // ERROR "overflow"
	b5   = uint8(^0)                                     // ERROR "overflow"
	b6   = ^uint8(0)                                     // OK
	b7   = uint8(Minus1)                                 // ERROR "overflow"
	b8   = uint8(int8(-1))                               // ERROR "overflow"
	b8a  = uint8(-1)                                     // ERROR "overflow"
	b9   byte                    = (1 << 10) >> 8        // OK
	b10  byte                    = (1 << 10)             // ERROR "overflow"
	b11  byte                    = (byte(1) << 10) >> 8  // ERROR "overflow"
	b12  byte                    = 1000                  // ERROR "overflow"
	b13  byte                    = byte(1000)            // ERROR "overflow"
	b14  byte                    = byte(100) * byte(100) // ERROR "overflow"
	b15  byte                    = byte(100) * 100       // ERROR "overflow"
	b16  byte                    = byte(0) * 1000        // ERROR "overflow"
	b16a byte                    = 0 * 1000              // OK
	b17  byte                    = byte(0) * byte(1000)  // ERROR "overflow"
	b18  byte                    = Uint8 / 0             // ERROR "division by zero"

	c1 float64     = Big
	c2 float64     = Big * Big          // ERROR "overflow"
	c3 float64     = float64(Big) * Big // ERROR "overflow"
	c4 = Big * Big                      // ERROR "overflow"
	c5 = Big / 0                        // ERROR "division by zero"
)

func f(int)

func main() {
	f(Int8)             // ERROR "convert|wrong type|cannot"
	f(Minus1)           // ERROR "convert|wrong type|cannot"
	f(Uint8)            // ERROR "convert|wrong type|cannot"
	f(Const)            // OK
	f(Float32)          // ERROR "convert|wrong type|cannot"
	f(Float64)          // ERROR "convert|wrong type|cannot"
	f(ConstFloat)       // ERROR "truncate"
	f(ConstFloat - 0.5) // OK
	f(Big)              // ERROR "convert|wrong type|cannot"
	f(String)           // ERROR "convert|wrong type|cannot|incompatible"
	f(Bool)             // ERROR "convert|wrong type|cannot|incompatible"
}

const ptr = nil // ERROR "const.*nil"
